home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekikoh Dennoh Club 3
/
Gekikoh Dennoh Club Vol. 3 (Japan).7z
/
Gekikoh Dennoh Club Vol. 3 (Japan) (Track 1).bin
/
games
/
rifler
/
c
/
src.lzh
/
Rifler_m.c
< prev
next >
Wrap
Text File
|
1997-12-21
|
5KB
|
192 lines
/*
Rifle the ancient remains
「古跡盗掘」
Rifleh_m.h monster etc.
BY SJOM
*/
#include "Rifler.h"
static RANGE monster_range_wall[10]={
{ 1,9,13,6 }, /* green slime */
{ 1,9,13,6 }, /* redslime */
{ 1,9,13,6 }, /* blue slime */
{ 1,5,13,10 }, /* dark slime */
{ 2,1,12,14 }, /* blue bat */
{ 2,1,12,14 }, /* black bat */
{ 0,5,15,10 }, /* zombie */
{ 0,5,15,10 }, /* ghoul */
{ 0,0,15,15 }, /* skeleton */
{ 0,3,15,12 } /* gargoyle */
};
static DIRECTION dir_dir[4]={
{ 1,0,0 },
{ 0,1,1 },
{ -1,0,2 },
{ 0,-1,3 }
};
static struct {
int prob;
int kind;
int speed;
int count;
int se;
} effector_set[10]={
{ no,0,0,0,no }, /* green slime */
{ no,0,0,0,no }, /* blue slime */
{ 400,0,1,3*16,spit_rot }, /* red slime */
{ 320,0,1,4*16,spit_rot }, /* black slime */
{ 300,1,2,16*16/3,supersound }, /* blue bat */
{ 260,1,2,32*16/3,supersound }, /* black bat */
{ 280,0,1,6*16,spit_rot }, /* zombie */
{ 240,2,1,8*16,spit_digester }, /* ghoul */
{ 200,3,1,32*16,cursed_breath }, /* skeleton */
{ 180,4,4,32*16/4,lightning_bolt } /* gargoyle */
};
static void
make_effector(int mons_no)
{
int loop;
int kind=monster[mons_no].kind;
if (kind<2)
return;
if ((overlap_bg_wall(monster[mons_no].pos.x+dir_dir[monster[mons_no].dir].x*8,
monster[mons_no].pos.y+dir_dir[monster[mons_no].dir].y*8,&monster_range_wall[kind])) && (kind!=9))
return;
if (rnd_mul16(effector_set[kind].prob)==yes) {
for (loop=0;loop<max_effector;loop++)
if (effector[loop].alive==no) {
se(effector_set[kind].se);
effector[loop].pos=monster[mons_no].pos;
effector[loop].alive=yes;
effector[loop].kind=effector_set[kind].kind;
effector[loop].dir=monster[mons_no].dir;
effector[loop].speed=effector_set[kind].speed;
effector[loop].count=effector_set[kind].count;
return;
};
};
}
static int monster_scope[4]={ 4*16,6*16,8*16,16*16 };
void
move_monster(void)
{
int loop;
if (monster_no is_nothing)
return;
for (loop=0;loop<monster_no;loop++) {
if (monster[loop].hp) {
POSITION sub=monster[loop].pos;
DIRECTION adsb;
make_effector(loop);
if (++monster[loop].sp_count>=monster[loop].speed) {
int kind=monster[loop].kind;
monster[loop].sp_count=0;
switch (kind) {
case 0: /* green slime */
case 1: /* blue slime */
case 2: /* red slime */
case 3: /* dark slime */
case 4: /* blue bat */
case 5: /* black bat */
if (monster[loop].sub) {
adsb=dir_dir[monster[loop].dir];
monster[loop].sub--;
} else {
adsb=*calc_dir8(&monster[loop].pos,&game_player.pos);
monster[loop].dir=adsb.dir/2;
};
if (++monster[loop].count>=6*2)
monster[loop].count=0;
break;
case 6: /* zombie */
case 7: /* ghoul */
case 8: /* skeleton */
case 9: /* gargoyle */
if (monster[loop].sub) {
adsb=dir_dir[monster[loop].dir];
monster[loop].sub--;
} else {
monster[loop].sub=4+rnd_mul16(16);
if (scope(&monster[loop].pos,&game_player.pos,monster_scope[kind-6]))
adsb=*calc_dir_axis(&monster[loop].pos,&game_player.pos);
else
adsb=dir_dir[rnd_mul16(4)];
monster[loop].dir=adsb.dir;
};
if (++monster[loop].count>=16)
monster[loop].count=0;
break;
case 10: /* will 'o' the wisp */
break;
};
sub.x+=adsb.x;
sub.y+=adsb.y;
if (!(overlap_bg_wall(sub.x,sub.y,&monster_range_wall[kind])))
monster[loop].pos=sub;
else {
monster[loop].dir=(monster[loop].dir+rnd_mul16(3)+1) & 3;
monster[loop].sub=4+rnd_mul16(16);
};
};
};
};
monster_sp_set();
}
static RANGE eff_range_wall={ 2,2,13,13 };
void
move_effector(void)
{
int loop;
if (monster_no is_nothing)
return;
for (loop=0;loop<max_effector;loop++) {
if (effector[loop].alive) {
DIRECTION adsb;
if (--effector[loop].count==0) {
effector[loop].alive=no;
} else {
int kind=effector[loop].kind;
switch (kind) {
case 0: /* rot */
case 1: /* supersonic */
case 2: /* digester */
adsb=dir_dir[effector[loop].dir];
break;
case 3: /* cursed breath */
adsb=*calc_dir_axis(&effector[loop].pos,&game_player.pos);
break;
case 4: /* lightning bolt */
adsb=*calc_dir8(&effector[loop].pos,&game_player.pos);
break;
};
effector[loop].pos.x+=adsb.x*effector[loop].speed;
effector[loop].pos.y+=adsb.y*effector[loop].speed;
if (kind!=4)
if (overlap_bg_wall(effector[loop].pos.x,
effector[loop].pos.y,&eff_range_wall))
effector[loop].alive=no;
};
};
};
effector_sp_set();
}